/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package extracao;

import DadosBD.Prereq;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Calendar;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 *
 * @author Gustavo & Rodrigo
 */
class Extracao {
    private Disciplina disciplina;
    private DadosHTML Text;
    private final InsereBD banco = new InsereBD();
    
    public Disciplina getDadosDisciplina(Dados data) throws CatalogoNaoExistente, DisciplinaNaoExistente, IOException, Exception{
        
        Logger logger = LoggerFactory.getLogger(Extracao.class);
        
        int currentYear = Calendar.getInstance().get(Calendar.YEAR);
        int ano = data.getAnoCatalogo();
       try { 
        if (ano<=ANO_CATALOGO_MUDANCA_FORMATO_1 && ano >=ANO_CATALOGO_INICIO){
            
            //Utiliza classe que faz extracao de catalogos antigos
            logger.info("Pesquisa sobre formato de catálogo antigo");
            
            ExtracaoCatalogoAntigo extract = new ExtracaoCatalogoAntigo();
            Text = extract.extrair(data);
            disciplina = TexttoDisciplina(Text);
            
            return disciplina;

            
        } else if ( ano>ANO_CATALOGO_MUDANCA_FORMATO_1 && ano <=currentYear){
            //Utiliza classe que faz extracao de catalogos novos
            logger.info("Pesquisa sobre formato de catálogo novo");
            
            ExtracaoCatalogoNovo extract = new ExtracaoCatalogoNovo();
            Text = extract.extrair(data);
            disciplina = TexttoDisciplina(Text);
            
            return disciplina;
            
        } else{
            throw new CatalogoNaoExistente("Ano de Catálogo não existente");
        }
        
        
    } catch (DisciplinaNaoExistente e) {
        /*Não conseguiu encontrar disciplina */
            logger.error("Disciplina requisitada não existente");
    } 
       catch (CatalogoNaoExistente e) {
        /*Não existe catálogo deste ano */
            logger.error("Ano de Catálogo inválido");
            
    }
       return null;
    }
    public static final int ANO_CATALOGO_MUDANCA_FORMATO_1 = 2011;
    public static final int ANO_CATALOGO_INICIO = 1998;
    
   private Disciplina TexttoDisciplina(DadosHTML HTML){
        /*Converte a representação dos dados que estão em Strings em DadosHTML
        para a o formato padrão da classe Disciplinas*/
       
        Disciplina dis = new Disciplina();
        dis.setNome(HTML.getNome());
        dis.setCodigo(HTML.getCodigo());        
        dis.setEmenta(HTML.getEmenta());
        dis.setCargaHoraria(HTML.getCargaHoraria());
        dis.setPreReq(HTML.getPrereqs());  //prereqs como uma grande String
        
        this.banco.inicia();
        String P = HTML.getPrereqs();
        if (P.contentEquals("Não há")){
            //não adiconamos nada na Array List
            //ao BD adicionamos a String "SEM" com familia zero
            banco.insere(HTML.getCodigo(), "SEM", 0); 
            
            
        }
        else {
            String[] saida = P.split("/");   //separa disciplinas "OU"
            int tam = saida.length;
            for (int i = 0; i < tam; i++) {  //para cada grupo "OU"
                String[] o;
                o = saida[i].split(" ");  //separa disciplinas "E"
                int size = o.length;
                for (int j = 0; j < size; j++) {
                    if(!(o[j].isEmpty())) {
                    //System.out.println(o[j]);
                    //adiciona a Array List de Pre-req da classe Disciplina
                    dis.addPreq(o[j], i+1);  //i+1 para comecarmos familia no 1
                    //adiciona ao BD o pre-req e sua familia associada
                    banco.insere(HTML.getCodigo().toUpperCase(), o[j], i+1);
                    }
                }
        }
        }
        return dis;
            }
    }


   
   
        

          
        
        
        
            
            
   
         
   
